/**
 * 给定长度为N的数组，分别求出长度为1，2，3，...，N的等差数列的数列
 * N只有80，权值有1E9
 * 令 Dijk 是首项为i，次项为j，长度为k的数列的数量
 * 当 Au - Aj == Aj - Ai 时, Dijk += D[j][u][k - 1]
 * 直接写一个O(N^4)的DP
 * 如果考虑用公差作状态，Didk是首项为i长度为k公差为d的方案总数，则
 * 无需查找，直接累加即可  D[i][Aj-Ai][k] += D[j][Aj-Ai][k-1]
 * 变为 O(N^3)
 * 但是公差范围很大，需要离散化，一共有N^2个公差，所以变为O(N^3logN)
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

llt const MOD = 998244353LL;

int N;
vi A;
vector<vector<vi>> D;


void work(){
    cin >> N;
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i) cin >> A[i];

    D.assign(N + 1, vector<vi>(N + 1, vi(N + 1, 0)));
    for(int i=1;i<=N;++i)for(int j=i+1;j<=N;++j){
        D[i][j][2] = 1;
    }

    for(int k=3;k<=N;++k){
        for(int i=1;i<=N;++i){
            for(int j=i+1;j<=N;++j){
                for(int u=j+1;u<=N;++u){
                    if(A[u] - A[j] == A[j] - A[i]){
                        (D[i][j][k] += D[j][u][k - 1]) %= MOD;
                    }
                }
            }
        }
    }

    cout << N;
    for(int i=2;i<=N;++i){
        llt ans = 0;
        for(int u=1;u<=N;++u)for(int v=1;v<=N;++v) ans = (ans + D[u][v][i]) % MOD;
        cout << " " << ans;
    }
    cout << endl;
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}